A register file is an array of processor registers (registers) in a central processing unit (CPU). Registers are temporary storage locations inside the CPU that hold data and addresses. Modern registers found on integrated circuits (ICs) are usually implemented using fast static random access memory (SRAM) with multiple ports. These SRAMs are usually distinguished by having one or more dedicated read and write ports, whereas other SRAMs are usually read and written through the same port.
Multi-port registers usually have one word line per entry per port, one bit line per bit of width per read port, and two bit lines per bit of width per write port. The area of a register is often determined by the number of wordlines and bitlines (i.e. the number of read and write ports) used in a register. Therefore, the area of a register may increase as the square of the number of ports a register contains. At some point, it may be smaller and/or faster to have multiple redundant registers, with a smaller numbers of ports, than a single register file with all the ports.
The time needed to write data to a multi-port register is determined in part by address decode logic and any buffering needed for the inputs. The time needed to write data to a multi-port register may be reduced by removing buffering to the inputs and “pipelining” (pipelining will be explained in more detail below) the inputs to a register. However, pipelining inputs to a register may add more area to the register. When pipelining of the inputs is used with a multi-port register, “data forwarding” (data forwarding will be explained in more detail below) may be used during an asynchronous read of the multi-port register. When the read and write addresses match during an asynchronous read, data is read from the pipelined registers, not the memory array registers.